package io.xxx.omni.oss.core

/**
 * 通过基本的分页模式拉取数据
 */
abstract class PageSynchronizer<R> : Synchronizer<R>() {

    /**
     * 起始页。
     */
    protected open val startPage = 1

    /**
     * 每页数据总数
     */
    protected open val pageSize = 100

    override fun fetchAndProcess(context: Context) {
        var response = getResponse(context, startPage, true)
        val count = getCount(context, response)
        log.info("${getLogPrefix(context.startTime, context.endTime)}数据总数 $count")

        var totalPage = count / pageSize + if (count % pageSize == 0) 0 else 1
        val pages = totalPage
        while (--totalPage >= 0) {
            val pageNo = totalPage + startPage
            response = getResponse(context, pageNo, false)
            process(context, response)
            log.info("${getLogPrefix(context.startTime, context.endTime)}第 $pageNo/$pages($pageSize) 页同步完毕")
        }
    }

    /**
     * 获取响应
     */
    protected abstract fun getResponse(context: Context, pageNo: Int, containsTotal: Boolean): R

    /**
     * 获取响应中的数据总数
     */
    protected abstract fun getCount(context: Context, response: R): Int
}